﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PraxisRent.Entities;
using PraxisRent.Repository;
using Microsoft.Practices.Unity;

namespace PraxisRent.BL
{
    public class EquipoBL:IEquipoBL
    {
        [Dependency]
        public IEquipoRepository equipoDAO { get; set; }

        public List<EQUIPO> GetAllFromEquipo()
        {
            return equipoDAO.GetAllFromEquipo();
        }

        public List<EQUIPO> GetALlFromEquipoByTipoMaquinaria()
        {
            return equipoDAO.GetALlFromEquipoByTipoMaquinaria();
        }

        public List<EQUIPO> GetALlFromEquipoByTipoEquipo()
        {
            return equipoDAO.GetALlFromEquipoByTipoEquipo();
        }

        public List<EQUIPO> GetALlFromEquipoByTipoMaquinariaDisponibles()
        {
            return equipoDAO.GetALlFromEquipoByTipoMaquinariaDisponibles();
        }

        public List<EQUIPO> GetALlFromEquipoByTipoEquipoDisponibles()
        {
            return equipoDAO.GetALlFromEquipoByTipoEquipoDisponibles();
        }

        public List<EQUIPO> GetALlFromEquipoByDisponibilidad()
        {
            return equipoDAO.GetALlFromEquipoByDisponibilidad();
        }

        public List<EQUIPO> GetAllFromEquipoByCriterio(string criterio)
        {
            return equipoDAO.GetAllFromEquipoByCriterio(criterio);
        }

        public EQUIPO GetAllFRomEquipoById(int id)
        {
            return equipoDAO.GetAllFRomEquipoById(id);
        }

        public List<EQUIPO> GetAllFromEquipoOfMaquinariasDisponibles(string criterio)
        {
            return equipoDAO.GetAllFromEquipoOfMaquinariasDisponibles(criterio);
        }

        public List<EQUIPO> GetAllFromEquipoOfEquiposDisponibles(string criterio)
        {
            return equipoDAO.GetAllFromEquipoOfEquiposDisponibles(criterio);
        }

        public List<EQUIPO> GetAllFromEquipoTipoMaquinariaByCriterio(string criterio)
        {
            return equipoDAO.GetAllFromEquipoTipoMaquinariaByCriterio(criterio);
        }

        public List<EQUIPO> GetAllFromEquipoTipoEquipoByCriterio(string criterio)
        {
            return equipoDAO.GetAllFromEquipoTipoEquipoByCriterio(criterio);
        }

        public List<EQUIPO> GetAllFromEquipoByCriterioDisponibles(string criterio)
        {
            return equipoDAO.GetAllFromEquipoByCriterioDisponibles(criterio);
        }

        public void AddEquipo(EQUIPO equipo)
        {
            var msg = "";

            if (equipo.SerieMotor != "")
            {
                var duplicidad = equipoDAO.ExisteDuplicidad(equipo.SerieMotor, equipo.Codigo);

                var ok = equipo.Validate(out msg);
                if (!duplicidad)
                {
                    if (ok)
                    {
                        equipoDAO.AddEquipo(equipo);
                    }
                    else
                    {
                        throw new Exception(msg);
                    }
                }
                else
                {
                    var error = string.Format("Ya existe una Serie de Motor con la misma Descripción" + " " + "\n" + equipo.SerieMotor);
                    throw new Exception(error);
                }
            }
            else
            {
                equipoDAO.AddEquipo(equipo);
            }
        }

        public void UpdateEquipo(EQUIPO equipo)
        {
            var msg = "";

            if (equipo.SerieMotor != "")
            {
                var duplicidad = equipoDAO.ExisteDuplicidad(equipo.SerieMotor, equipo.Codigo);

                var ok = equipo.Validate(out msg);
                if (!duplicidad)
                {
                    if (ok)
                    {
                        equipoDAO.UpdateEquipo(equipo);
                    }
                    else
                    {
                        throw new Exception(msg);
                    }
                }
                else
                {
                    var error = string.Format("Ya existe una Serie de Motor con la misma Descripción" + " " + "\n" + equipo.SerieMotor);
                    throw new Exception(error);
                }
            }
            else
            {
                equipoDAO.UpdateEquipo(equipo);
            }
        }

        public void DeleteEquipo(int id)
        {
            throw new NotImplementedException();
        }
    }
}
